package com.baite.demo.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

@Slf4j
public class JSONUtil {

 private static ObjectMapper objectMapper = new ObjectMapper();

  /**
   * 对象转Json格式字符串
   * @param obj 对象
   * @return Json格式字符串
   */
  public static <T> String parseObject(T obj) {
    if (obj == null) {
      return null;
    }
    try {
      return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
      log.warn("Parse Object to String error : {}", e.getMessage());
      return null;
    }
  }

  /**
   * 对象转Json格式字符串(格式化的Json字符串)
   * @param obj 对象
   * @return 美化的Json格式字符串
   */
  public static <T> String toJSONString(T obj) {
    if (obj == null) {
      return null;
    }
    try {
      return obj instanceof String ? (String) obj : objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
    } catch (JsonProcessingException e) {
      log.warn("Parse Object to String error : {}", e.getMessage());
      return null;
    }
  }

  /**
   * 字符串转换为自定义对象
   * @param str 要转换的字符串
   * @param clazz 自定义对象的class对象
   * @return 自定义对象
   */
  public static <T> T toJSONString(String str, Class<T> clazz){
    if(StringUtils.isEmpty(str) || clazz == null){
      return null;
    }
    try {
      return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
    } catch (Exception e) {
      log.warn("Parse String to Object error : {}", e.getMessage());
      return null;
    }
  }

}
